Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

' Nota: las direcciones no son validadas por defecto con DirecciónValidator
<MetadataType(GetType(DirecciónMetadata))>
Public Class Dirección

    Function Completa2(ByVal sepLínea As String) As String
        Return String.Format("{1} {2} {3}{4} {5}{6} {7}{0}{8} {9} (MADRID)",
                             sepLínea,
                             If(TipoVía Is Nothing, "??", TipoVía.Nombre),
                             Vía,
                             If(Número = 0, "S/N", Número.ToString),
                             If(String.IsNullOrWhiteSpace(Portal & Letra) AndAlso Not Piso.HasValue, "", ", "),
                             If(String.IsNullOrEmpty(Portal), "", "Portal " & Portal & " "),
                             If(Piso.HasValue, If(Piso = 0, "Bajo", If(Piso = -1, "Sótano", Piso & "º")), ""),
                             Letra,
                             CódigoPostal,
                             Población.Nombre)
    End Function

    ReadOnly property Completa() As String
        Get
            Return Completa2(vbCrLf)
        End Get
    End Property

    Function JSon As DirecciónJson
        Return New DirecciónJson With {
            .tipovia = TipoVíaId,
            .via = Vía,
            .numero = Número,
            .portal = Portal,
            .piso = If(Piso.HasValue, piso.Value, 0),
            .letra = Letra,
            .codigoPostal = CódigoPostal,
            .poblacion = PoblaciónId
        }
    End Function

    Public Sub Copiar(otra As Dirección)
        Me.TipoVíaId=otra.TipoVíaId
        Me.Vía=otra.Vía
        Me.Número=otra.Número
        Me.Portal=otra.Portal
        Me.Piso=otra.Piso
        Me.Letra=otra.Letra
        Me.CódigoPostal=otra.CódigoPostal
        Me.PoblaciónId=otra.PoblaciónId
    End Sub

    Public Overrides Function ToString() As String
        Return Completa()
    End Function
End Class

Public Class DirecciónJson
    Property tipovia As Integer
    Property via As String
    Property numero As Integer
    Property portal As String
    Property piso As Integer
    Property letra As String
    Property codigoPostal As String
    Property poblacion As integer
End Class